package com.itlong.cloud.operate.service;

import com.itlong.cloud.POJO.DTO.operate.*;
import com.itlong.cloud.POJO.PO.ProjectPO;
import com.itlong.cloud.POJO.VO.MessageVO;
import com.itlong.cloud.POJO.VO.operate.*;
import com.itlong.cloud.POJO.VO.property.PropertyRoleProjectGetVO;
import com.itlong.cloud.POJO.VO.property.PropertyTreeMenuVO;
import com.itlong.cloud.utils.page.Page;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      项目信息处理接口。
 * </desc>
 *
 * @createDate 2017-10-10.
 */
public interface IOperateProjectService {

    /**
     * <desc>
     *      判断项目存在性
     * <desc/>
     *
     * @param projectId 项目编号
     * @return 同编号项目个数
     * @author Chunjian.G
     * @createDate 2017-10-27
     */
    Integer checkProjectExist(String projectId) throws Exception;

     /**
      * <desc>
      *      添加单个项目
      * <desc/>
      *
      * @param saveDTO 项目新增信息
      * @return
      * @author Chunjian.G
      * @createDate 2017-10-12
      */
    Integer saveProject(OperateProjectSaveDTO saveDTO) throws  Exception;

    /**
     * <desc>
     *      更新单个项目信息
     * <desc/>
     *
     * @param updateDTO 项目更新信息
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-11
     */
    Integer updateProject(OperateProjectUpdateDTO updateDTO) throws Exception;

     /**
      * <desc>
      *      分页查询项目信息
      * <desc/>
      *
      * @param pageDTO 分页查询项目信息DTO
      * @return
      * @author Chunjian.G
      * @createDate 2017-10-10
      */
    Page<OperateProjectVO> getPage(OperateProjectGetPageDTO pageDTO) throws Exception;

     /**
      * <desc>
      *      获取单个项目详情
      * <desc/>
      *
      * @param projectId 项目编号
      * @return
      * @author Chunjian.G
      * @createDate 2017-10-11
      */
    OperateProjectDetailVO getDetail(String projectId) throws Exception;

    /**
     * <desc>
     *      单表-获取项目信息
     * <desc/>
     *
     * @param projectId 项目编号
     * @return
     * @author Chunjian.G
     * @createDate 2017-12-05
     */
    ProjectPO getOneProject(String projectId) throws Exception;

    /**
    * <desc>
    *       查询单个项目的关联设备列表
    * <desc/>
    *
    * @param projectId 项目编号
    * @return
    * @author Chunjian.G
    * @createDate 2017-10-13
    */
    List<OperateProjectRelatedProductVO> getRelatedProducts(String projectId) throws Exception;

    /**
    * <desc>
    *      保存单个项目的关联设备（会先删除之前的关联记录）
    * <desc/>
    *
    * @param projectId 项目ID
    * @param saveDTOS 关联设备新增信息
    * @return
    * @author Chunjian.G
    * @createDate 2017-10-13
    */
    Integer saveRelatedProducts(String projectId, List<OperateProjectRelatedProductSaveDTO> saveDTOS) throws Exception;

    /**
     * <desc>
     *      根据用户id查询关联的所有项目id及名称
     * </desc>
     *
     * @param userId 用户id
     * @return
     * @aurhor Jiaqi.X
     * @createDate 2017/10/11
     */
    Map<String,Object> getEngineerProjectInfo(@Param("userId")String userId);

    /**
     * <desc>
     *      获取所有项目信息，只取id及名称供下拉菜单使用
     * </desc>
     *
     * @return
     * @author Jiaqi.X
     * @craeteDate 2017/10/11
     */
    Page<OperateAllotProjectVO> getAllotProjectPage(OperateAllotProjectDTO pageDTO) throws Exception;

    /**
     * <desc>
     *      更改项目状态
     * <desc/>
     *
     * @param projectId 项目Id
     * @param status 项目状态，默认1，0-删除，1启用，2-禁用
     * @return
     * @author zhangs
     * @createDate 2017/10/31
     */
    void updateProjectStatus(String projectId, String status) throws Exception;


    /**
     * <desc>
     *      是否启用云对讲。
     * <desc/>
     *
     * @param  projectId 项目编号
     * @return 0-禁用  1-启用
     * @author shengen.T
     * @createDate 2017-11-30
     */
    Integer getIsSmartCommunity(String projectId) throws Exception;

    /**
     * <desc>
     *      是否启用云电梯和蓝牙电梯
     * <desc/>
     *
     * @param  projectId 项目编号
     * @return 0-禁用  1-启用
     * @author Juguang.S
     * @createDate 2018-04-09
     */
    Map<String,Integer> getIsCloudElevator(String projectId) throws Exception;

    /**
     * <desc>
     *      获取项目状态：1-启用，2-禁用
     * <desc/>
     *
     * @param projectId 项目编号
     * @return
     * @author Chunjian.G
     * @createDate 2017-12-01
     */
    Integer getProjectStatus(String projectId) throws Exception;

    /**
     * <desc>
     *      获取项目列表。
     * <desc/>
     *
     * @param  projectName 项目编号
     * @return
     * @author shengen.T
     * @createDate 2018-01-12
     */
     List<OperateProjectInfoVO> getProjectInfoList(String projectName) throws Exception;


    /**
     * <desc>
     *    获取项目所在省份/自治区/直辖市名称.
     * </desc>
     *
     * @param  projectId 项目Id
     * @return 所在省份/自治区/直辖市名称
     * @author LewisLouis
     * @createDate 2018-01-27
     */
    String getProjectCityName(String projectId);

    /**
     * <desc>
     *      判断项目云设备状态是否为启用
     * </desc>
     *
     * @param projectId 项目id
     * @param type  设备类型 1云对讲 2云电梯
     * @return
     * @author Jiaqi.X
     * @createDate 2018/04/24
     */
    public boolean checkProjectCloudDeviceStatus(String projectId,Integer type);

    /**
     * <desc>
     *      获取用户权限和项目信息相关字段，用于云电梯SDK上报设备信息变更后接口数据结构说明
     * </desc>
     *
     * @param projectId 项目id
     * @return 获取用户项目信息VO
     * @author wangzhi
     * @createDate 2019/01/21
     */
    List<PropertyRoleProjectGetVO> getRoleProjectInfo(String projectId) throws Exception;

    /**
     * <desc>
     *      根据项目编号获取项目类型 住宅和办公。
     * <desc/>
     *
     * @param  projectId 项目编号
     * @return 项目类型
     * @author Juguang.S
     * @createDate 2019-08-14
     */
    String getProjectType(String projectId) throws Exception;

    /**
     * <desc>
     *      查询通行行方式占比
     * </desc>
     *
     * @param
     * @return OperateProjectStatisticInfoVO
     * @Author Zhu.yj
     * @createDate  2019/10/28
     */
    List<Map<String ,Object>> getPassTypePercent() throws Exception;

    /**
     * <desc>
     *      查询城市项目排行
     * </desc>
     *
     * @param
     * @return
     * @Author Zhu.yj
     * @createDate  2019/10/31
     */
    OperateProjectStatisticInfoVO getCityProjectRank() throws Exception;

    /**
     * <desc>
     * 获取可用最小项目编号值
     * </desc>
     *
     * @return
     * @Author caoshuai
     * @createDate 2020/09/16
     */
    String getMinProjectId();
    /**
     *<desc>
     * RobotGo调试工具获取项目下的开发者用户的 机器人设备授权状态和机器人白名单授权状态
     *</desc>
     *
     * @Author  chengshican
     * @Date   2020-09-17 17:00
     * @Param
     * @Return
     * @Exception
     *
     */
    Map<String ,Object> getRobotGoProjectWhitelistAndDeviceAuthStatusByUserId(String projectId,String userId) throws Exception;

    /**
     * <desc>
     *      获取证书详情
     * </desc>
     *
     * @param operateLicenseDTO 查询参数DTO
     * @return
     * @Author Zhu.yj
     * @createDate  2020/9/17
     */
    OperateLicenseAllInfoVO getLicenseDetail(OperateLicenseDTO operateLicenseDTO) throws Exception;

    /**
     * <desc>
     *      修改特征码状态
     * </desc>
     *
     * @param operateLicenseDTO 查询参数DTO
     * @return
     * @Author Zhu.yj
     * @createDate  2020/9/17
     */
    Integer updatePCStatus(OperateLicenseDTO operateLicenseDTO) throws Exception;

    /**
     * <desc>
     *      获取日志分页列表
     * </desc>
     *
     * @param operateLicenseDTO
     * @return
     * @Author Zhu.yj
     * @createDate  2020/9/18
     */
    Page<OperateProjectLogPageVO> getLogPage(OperateLicenseDTO operateLicenseDTO) throws Exception;

    /**
     * <desc>
     *      保存电脑特征码
     * </desc>
     *
     * @param operateLicenseDTO 证书管理DTO
     * @return 受影响行数
     * @Author Zhu.yj
     * @createDate  2020/9/18
     */
    MessageVO savePcInfo(OperateLicenseDTO operateLicenseDTO) throws Exception;

    /**
     * <desc>
     *      获取证书
     * </desc>
     *
     * @param operateLicenseDTO 参数DTO
     * @return
     * @Author Zhu.yj
     * @createDate  2020/9/24
     */
    Map<String, Object> getCertificate(OperateLicenseDTO operateLicenseDTO) throws Exception;

    /**
     * <desc>
     *      在线查询证书
     * </desc>
     *
     * @param operateLicenseDTO 证书管理DTO
     * @return
     * @Author Zhu.yj
     * @createDate  2020/9/25
     */
    OperateOnlineLicenseInfoVO getLicense(OperateLicenseDTO operateLicenseDTO) throws Exception;

    /**
     * <desc>
     *      下载证书
     * </desc>
     *
     * @param operateLicenseDTO 证书管理DTO
     * @return 证书加密字符串
     * @Author Zhu.yj
     * @createDate  2020/9/27
     */
    Map<String, Object> licenseDownload(OperateLicenseDTO operateLicenseDTO) throws Exception;

    /**
     * <desc>
     *      获取特征码信息列表
     * </desc>
     *
     * @param operateLicenseDTO 证书管理DTO
     * @return
     * @Author Zhu.yj
     * @createDate  2020/9/27
     */
    List<String> getPcInfoList(OperateLicenseDTO operateLicenseDTO) throws Exception;

    /**
     * <desc>
     *      同步项目与特征码对应记录表数据()
     * </desc>
     *
     * @Author Zhu.yj
     * @createDate  2020/10/13
     */
    Integer synchronizeData() throws Exception;

    Object timeTaskDevicePassRecordLatestSave(String startTime1, String endTime1, String startTime2, String endTime2);

    Integer getCountBySceneId(String sceneId);


    /**
     * <desc>
     *      获取用户角色组列表
     * </desc>
     *
     * @param projectId
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/19
     */
    List<Map<String, Object>> getUserRoleList(String projectId) throws Exception;


    /**
     * <desc>
     *      获取项目下的楼栋、单元房间列表
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/19
     */
    List<PropertyTreeMenuVO> getBuildList(String projectId) throws Exception;

}
